Open vSwitch CI 70cc8f
diff --git a/NEWS b/NEWS
Open vSwitch CI 1ce680
index 2e5356c5cd..c670cf8f35 100644
Open vSwitch CI 70cc8f
--- a/NEWS
Open vSwitch CI 70cc8f
+++ b/NEWS
Open vSwitch CI 1ce680
@@ -1,3 +1,6 @@
Open vSwitch CI 039fb7
+v3.5.1 - xx xxx xxxx
Open vSwitch CI 039fb7
+--------------------
Open vSwitch CI 039fb7
+
Open vSwitch CI 1ce680
 v3.5.0 - 17 Feb 2025
Open vSwitch CI 70cc8f
 --------------------
Open vSwitch CI 70cc8f
    - The limit on the number of fields for address prefix tracking in flow
Open vSwitch CI 70cc8f
diff --git a/configure.ac b/configure.ac
Open vSwitch CI 1ce680
index 2b19888775..60122e4913 100644
Open vSwitch CI 70cc8f
--- a/configure.ac
Open vSwitch CI 70cc8f
+++ b/configure.ac
Open vSwitch CI 70cc8f
@@ -13,7 +13,7 @@
Open vSwitch CI 70cc8f
 # limitations under the License.
Open vSwitch CI 70cc8f
 
Open vSwitch CI 70cc8f
 AC_PREREQ(2.63)
Open vSwitch CI 1ce680
-AC_INIT(openvswitch, 3.5.0, bugs@openvswitch.org)
Open vSwitch CI 039fb7
+AC_INIT(openvswitch, 3.5.1, bugs@openvswitch.org)
Open vSwitch CI 70cc8f
 AC_CONFIG_SRCDIR([vswitchd/ovs-vswitchd.c])
Open vSwitch CI 70cc8f
 AC_CONFIG_MACRO_DIR([m4])
Open vSwitch CI 70cc8f
 AC_CONFIG_AUX_DIR([build-aux])
Open vSwitch CI 70cc8f
diff --git a/debian/changelog b/debian/changelog
Open vSwitch CI 1ce680
index 1ba7afbf40..ad638cc44f 100644
Open vSwitch CI 70cc8f
--- a/debian/changelog
Open vSwitch CI 70cc8f
+++ b/debian/changelog
Open vSwitch CI 1ce680
@@ -1,3 +1,9 @@
Open vSwitch CI 039fb7
+openvswitch (3.5.1-1) unstable; urgency=low
Open vSwitch CI 039fb7
+   [ Open vSwitch team ]
Open vSwitch CI 039fb7
+   * New upstream version
Open vSwitch CI 039fb7
+
Open vSwitch CI 039fb7
+ -- Open vSwitch team <dev@openvswitch.org>  Mon, 17 Feb 2025 13:13:23 +0100
Open vSwitch CI 039fb7
+
Open vSwitch CI 1ce680
 openvswitch (3.5.0-1) unstable; urgency=low
Open vSwitch CI 70cc8f
 
Open vSwitch CI 70cc8f
    * New upstream version
Open vSwitch CI 70cc8f
diff --git a/dpdk/VERSION b/dpdk/VERSION
Open vSwitch CI 70cc8f
index 0a492611a0..9e2934aa34 100644
Open vSwitch CI 70cc8f
--- a/dpdk/VERSION
Open vSwitch CI 70cc8f
+++ b/dpdk/VERSION
Open vSwitch CI 70cc8f
@@ -1 +1 @@
Open vSwitch CI 70cc8f
-24.11.0
Open vSwitch CI 70cc8f
+24.11.1
Open vSwitch CI 70cc8f
diff --git a/dpdk/doc/guides/rel_notes/release_24_11.rst b/dpdk/doc/guides/rel_notes/release_24_11.rst
Open vSwitch CI 70cc8f
index 8486cd986f..f9df63141e 100644
Open vSwitch CI 70cc8f
--- a/dpdk/doc/guides/rel_notes/release_24_11.rst
Open vSwitch CI 70cc8f
+++ b/dpdk/doc/guides/rel_notes/release_24_11.rst
Open vSwitch CI 70cc8f
@@ -616,3 +616,22 @@ Tested Platforms
Open vSwitch CI 70cc8f
       * Firmware version: 2.14, 0x8000028c
Open vSwitch CI 70cc8f
       * Device id (pf): 8086:125b
Open vSwitch CI 70cc8f
       * Driver version(in-tree): 6.8.0-45-generic (Ubuntu24.04.1)(igc)
Open vSwitch CI 70cc8f
+
Open vSwitch CI 70cc8f
+24.11.1 Release Notes
Open vSwitch CI 70cc8f
+---------------------
Open vSwitch CI 70cc8f
+
Open vSwitch CI 70cc8f
+
Open vSwitch CI 70cc8f
+24.11.1 Fixes
Open vSwitch CI 70cc8f
+~~~~~~~~~~~~~
Open vSwitch CI 70cc8f
+
Open vSwitch CI 70cc8f
+* net/virtio: fix Rx checksum calculation
Open vSwitch CI 70cc8f
+
Open vSwitch CI 70cc8f
+24.11.1 Validation
Open vSwitch CI 70cc8f
+~~~~~~~~~~~~~~~~~~
Open vSwitch CI 70cc8f
+
Open vSwitch CI 70cc8f
+* Tested by Red Hat validation team
Open vSwitch CI 70cc8f
+
Open vSwitch CI 70cc8f
+24.11.1 Known Issues
Open vSwitch CI 70cc8f
+~~~~~~~~~~~~~~~~~~~~
Open vSwitch CI 70cc8f
+
Open vSwitch CI 70cc8f
+* DPDK 24.11.1 contains DPDK 24.11 plus the fix for CVE-2024-11614 only
Open vSwitch CI c49a4a
diff --git a/dpdk/kernel/linux/uapi/linux/vduse.h b/dpdk/kernel/linux/uapi/linux/vduse.h
Open vSwitch CI c49a4a
new file mode 100644
Open vSwitch CI c49a4a
index 0000000000..11bd48c72c
Open vSwitch CI c49a4a
--- /dev/null
Open vSwitch CI c49a4a
+++ b/dpdk/kernel/linux/uapi/linux/vduse.h
Open vSwitch CI c49a4a
@@ -0,0 +1,353 @@
Open vSwitch CI c49a4a
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
Open vSwitch CI c49a4a
+#ifndef _UAPI_VDUSE_H_
Open vSwitch CI c49a4a
+#define _UAPI_VDUSE_H_
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+#include <linux/types.h>
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+#define VDUSE_BASE	0x81
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/* The ioctls for control device (/dev/vduse/control) */
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+#define VDUSE_API_VERSION	0
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/*
Open vSwitch CI c49a4a
+ * Get the version of VDUSE API that kernel supported (VDUSE_API_VERSION).
Open vSwitch CI c49a4a
+ * This is used for future extension.
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+#define VDUSE_GET_API_VERSION	_IOR(VDUSE_BASE, 0x00, __u64)
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/* Set the version of VDUSE API that userspace supported. */
Open vSwitch CI c49a4a
+#define VDUSE_SET_API_VERSION	_IOW(VDUSE_BASE, 0x01, __u64)
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/**
Open vSwitch CI c49a4a
+ * struct vduse_dev_config - basic configuration of a VDUSE device
Open vSwitch CI c49a4a
+ * @name: VDUSE device name, needs to be NUL terminated
Open vSwitch CI c49a4a
+ * @vendor_id: virtio vendor id
Open vSwitch CI c49a4a
+ * @device_id: virtio device id
Open vSwitch CI c49a4a
+ * @features: virtio features
Open vSwitch CI c49a4a
+ * @vq_num: the number of virtqueues
Open vSwitch CI c49a4a
+ * @vq_align: the allocation alignment of virtqueue's metadata
Open vSwitch CI c49a4a
+ * @reserved: for future use, needs to be initialized to zero
Open vSwitch CI c49a4a
+ * @config_size: the size of the configuration space
Open vSwitch CI c49a4a
+ * @config: the buffer of the configuration space
Open vSwitch CI c49a4a
+ *
Open vSwitch CI c49a4a
+ * Structure used by VDUSE_CREATE_DEV ioctl to create VDUSE device.
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+struct vduse_dev_config {
Open vSwitch CI c49a4a
+#define VDUSE_NAME_MAX	256
Open vSwitch CI c49a4a
+	char name[VDUSE_NAME_MAX];
Open vSwitch CI c49a4a
+	__u32 vendor_id;
Open vSwitch CI c49a4a
+	__u32 device_id;
Open vSwitch CI c49a4a
+	__u64 features;
Open vSwitch CI c49a4a
+	__u32 vq_num;
Open vSwitch CI c49a4a
+	__u32 vq_align;
Open vSwitch CI c49a4a
+	__u32 reserved[13];
Open vSwitch CI c49a4a
+	__u32 config_size;
Open vSwitch CI c49a4a
+	__u8 config[];
Open vSwitch CI c49a4a
+};
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/* Create a VDUSE device which is represented by a char device (/dev/vduse/$NAME) */
Open vSwitch CI c49a4a
+#define VDUSE_CREATE_DEV	_IOW(VDUSE_BASE, 0x02, struct vduse_dev_config)
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/*
Open vSwitch CI c49a4a
+ * Destroy a VDUSE device. Make sure there are no more references
Open vSwitch CI c49a4a
+ * to the char device (/dev/vduse/$NAME).
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+#define VDUSE_DESTROY_DEV	_IOW(VDUSE_BASE, 0x03, char[VDUSE_NAME_MAX])
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/* The ioctls for VDUSE device (/dev/vduse/$NAME) */
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/**
Open vSwitch CI c49a4a
+ * struct vduse_iotlb_entry - entry of IOTLB to describe one IOVA region [start, last]
Open vSwitch CI c49a4a
+ * @offset: the mmap offset on returned file descriptor
Open vSwitch CI c49a4a
+ * @start: start of the IOVA region
Open vSwitch CI c49a4a
+ * @last: last of the IOVA region
Open vSwitch CI c49a4a
+ * @perm: access permission of the IOVA region
Open vSwitch CI c49a4a
+ *
Open vSwitch CI c49a4a
+ * Structure used by VDUSE_IOTLB_GET_FD ioctl to find an overlapped IOVA region.
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+struct vduse_iotlb_entry {
Open vSwitch CI c49a4a
+	__u64 offset;
Open vSwitch CI c49a4a
+	__u64 start;
Open vSwitch CI c49a4a
+	__u64 last;
Open vSwitch CI c49a4a
+#define VDUSE_ACCESS_RO 0x1
Open vSwitch CI c49a4a
+#define VDUSE_ACCESS_WO 0x2
Open vSwitch CI c49a4a
+#define VDUSE_ACCESS_RW 0x3
Open vSwitch CI c49a4a
+	__u8 perm;
Open vSwitch CI c49a4a
+};
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/*
Open vSwitch CI c49a4a
+ * Find the first IOVA region that overlaps with the range [start, last]
Open vSwitch CI c49a4a
+ * and return the corresponding file descriptor. Return -EINVAL means the
Open vSwitch CI c49a4a
+ * IOVA region doesn't exist. Caller should set start and last fields.
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+#define VDUSE_IOTLB_GET_FD	_IOWR(VDUSE_BASE, 0x10, struct vduse_iotlb_entry)
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/*
Open vSwitch CI c49a4a
+ * Get the negotiated virtio features. It's a subset of the features in
Open vSwitch CI c49a4a
+ * struct vduse_dev_config which can be accepted by virtio driver. It's
Open vSwitch CI c49a4a
+ * only valid after FEATURES_OK status bit is set.
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+#define VDUSE_DEV_GET_FEATURES	_IOR(VDUSE_BASE, 0x11, __u64)
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/**
Open vSwitch CI c49a4a
+ * struct vduse_config_data - data used to update configuration space
Open vSwitch CI c49a4a
+ * @offset: the offset from the beginning of configuration space
Open vSwitch CI c49a4a
+ * @length: the length to write to configuration space
Open vSwitch CI c49a4a
+ * @buffer: the buffer used to write from
Open vSwitch CI c49a4a
+ *
Open vSwitch CI c49a4a
+ * Structure used by VDUSE_DEV_SET_CONFIG ioctl to update device
Open vSwitch CI c49a4a
+ * configuration space.
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+struct vduse_config_data {
Open vSwitch CI c49a4a
+	__u32 offset;
Open vSwitch CI c49a4a
+	__u32 length;
Open vSwitch CI c49a4a
+	__u8 buffer[];
Open vSwitch CI c49a4a
+};
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/* Set device configuration space */
Open vSwitch CI c49a4a
+#define VDUSE_DEV_SET_CONFIG	_IOW(VDUSE_BASE, 0x12, struct vduse_config_data)
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/*
Open vSwitch CI c49a4a
+ * Inject a config interrupt. It's usually used to notify virtio driver
Open vSwitch CI c49a4a
+ * that device configuration space has changed.
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+#define VDUSE_DEV_INJECT_CONFIG_IRQ	_IO(VDUSE_BASE, 0x13)
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/**
Open vSwitch CI c49a4a
+ * struct vduse_vq_config - basic configuration of a virtqueue
Open vSwitch CI c49a4a
+ * @index: virtqueue index
Open vSwitch CI c49a4a
+ * @max_size: the max size of virtqueue
Open vSwitch CI c49a4a
+ * @reserved: for future use, needs to be initialized to zero
Open vSwitch CI c49a4a
+ *
Open vSwitch CI c49a4a
+ * Structure used by VDUSE_VQ_SETUP ioctl to setup a virtqueue.
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+struct vduse_vq_config {
Open vSwitch CI c49a4a
+	__u32 index;
Open vSwitch CI c49a4a
+	__u16 max_size;
Open vSwitch CI c49a4a
+	__u16 reserved[13];
Open vSwitch CI c49a4a
+};
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/*
Open vSwitch CI c49a4a
+ * Setup the specified virtqueue. Make sure all virtqueues have been
Open vSwitch CI c49a4a
+ * configured before the device is attached to vDPA bus.
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+#define VDUSE_VQ_SETUP		_IOW(VDUSE_BASE, 0x14, struct vduse_vq_config)
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/**
Open vSwitch CI c49a4a
+ * struct vduse_vq_state_split - split virtqueue state
Open vSwitch CI c49a4a
+ * @avail_index: available index
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+struct vduse_vq_state_split {
Open vSwitch CI c49a4a
+	__u16 avail_index;
Open vSwitch CI c49a4a
+};
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/**
Open vSwitch CI c49a4a
+ * struct vduse_vq_state_packed - packed virtqueue state
Open vSwitch CI c49a4a
+ * @last_avail_counter: last driver ring wrap counter observed by device
Open vSwitch CI c49a4a
+ * @last_avail_idx: device available index
Open vSwitch CI c49a4a
+ * @last_used_counter: device ring wrap counter
Open vSwitch CI c49a4a
+ * @last_used_idx: used index
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+struct vduse_vq_state_packed {
Open vSwitch CI c49a4a
+	__u16 last_avail_counter;
Open vSwitch CI c49a4a
+	__u16 last_avail_idx;
Open vSwitch CI c49a4a
+	__u16 last_used_counter;
Open vSwitch CI c49a4a
+	__u16 last_used_idx;
Open vSwitch CI c49a4a
+};
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/**
Open vSwitch CI c49a4a
+ * struct vduse_vq_info - information of a virtqueue
Open vSwitch CI c49a4a
+ * @index: virtqueue index
Open vSwitch CI c49a4a
+ * @num: the size of virtqueue
Open vSwitch CI c49a4a
+ * @desc_addr: address of desc area
Open vSwitch CI c49a4a
+ * @driver_addr: address of driver area
Open vSwitch CI c49a4a
+ * @device_addr: address of device area
Open vSwitch CI c49a4a
+ * @split: split virtqueue state
Open vSwitch CI c49a4a
+ * @packed: packed virtqueue state
Open vSwitch CI c49a4a
+ * @ready: ready status of virtqueue
Open vSwitch CI c49a4a
+ *
Open vSwitch CI c49a4a
+ * Structure used by VDUSE_VQ_GET_INFO ioctl to get virtqueue's information.
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+struct vduse_vq_info {
Open vSwitch CI c49a4a
+	__u32 index;
Open vSwitch CI c49a4a
+	__u32 num;
Open vSwitch CI c49a4a
+	__u64 desc_addr;
Open vSwitch CI c49a4a
+	__u64 driver_addr;
Open vSwitch CI c49a4a
+	__u64 device_addr;
Open vSwitch CI c49a4a
+	union {
Open vSwitch CI c49a4a
+		struct vduse_vq_state_split split;
Open vSwitch CI c49a4a
+		struct vduse_vq_state_packed packed;
Open vSwitch CI c49a4a
+	};
Open vSwitch CI c49a4a
+	__u8 ready;
Open vSwitch CI c49a4a
+};
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/* Get the specified virtqueue's information. Caller should set index field. */
Open vSwitch CI c49a4a
+#define VDUSE_VQ_GET_INFO	_IOWR(VDUSE_BASE, 0x15, struct vduse_vq_info)
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/**
Open vSwitch CI c49a4a
+ * struct vduse_vq_eventfd - eventfd configuration for a virtqueue
Open vSwitch CI c49a4a
+ * @index: virtqueue index
Open vSwitch CI c49a4a
+ * @fd: eventfd, -1 means de-assigning the eventfd
Open vSwitch CI c49a4a
+ *
Open vSwitch CI c49a4a
+ * Structure used by VDUSE_VQ_SETUP_KICKFD ioctl to setup kick eventfd.
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+struct vduse_vq_eventfd {
Open vSwitch CI c49a4a
+	__u32 index;
Open vSwitch CI c49a4a
+#define VDUSE_EVENTFD_DEASSIGN -1
Open vSwitch CI c49a4a
+	int fd;
Open vSwitch CI c49a4a
+};
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/*
Open vSwitch CI c49a4a
+ * Setup kick eventfd for specified virtqueue. The kick eventfd is used
Open vSwitch CI c49a4a
+ * by VDUSE kernel module to notify userspace to consume the avail vring.
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+#define VDUSE_VQ_SETUP_KICKFD	_IOW(VDUSE_BASE, 0x16, struct vduse_vq_eventfd)
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/*
Open vSwitch CI c49a4a
+ * Inject an interrupt for specific virtqueue. It's used to notify virtio driver
Open vSwitch CI c49a4a
+ * to consume the used vring.
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+#define VDUSE_VQ_INJECT_IRQ	_IOW(VDUSE_BASE, 0x17, __u32)
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/**
Open vSwitch CI c49a4a
+ * struct vduse_iova_umem - userspace memory configuration for one IOVA region
Open vSwitch CI c49a4a
+ * @uaddr: start address of userspace memory, it must be aligned to page size
Open vSwitch CI c49a4a
+ * @iova: start of the IOVA region
Open vSwitch CI c49a4a
+ * @size: size of the IOVA region
Open vSwitch CI c49a4a
+ * @reserved: for future use, needs to be initialized to zero
Open vSwitch CI c49a4a
+ *
Open vSwitch CI c49a4a
+ * Structure used by VDUSE_IOTLB_REG_UMEM and VDUSE_IOTLB_DEREG_UMEM
Open vSwitch CI c49a4a
+ * ioctls to register/de-register userspace memory for IOVA regions
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+struct vduse_iova_umem {
Open vSwitch CI c49a4a
+	__u64 uaddr;
Open vSwitch CI c49a4a
+	__u64 iova;
Open vSwitch CI c49a4a
+	__u64 size;
Open vSwitch CI c49a4a
+	__u64 reserved[3];
Open vSwitch CI c49a4a
+};
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/* Register userspace memory for IOVA regions */
Open vSwitch CI c49a4a
+#define VDUSE_IOTLB_REG_UMEM	_IOW(VDUSE_BASE, 0x18, struct vduse_iova_umem)
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/* De-register the userspace memory. Caller should set iova and size field. */
Open vSwitch CI c49a4a
+#define VDUSE_IOTLB_DEREG_UMEM	_IOW(VDUSE_BASE, 0x19, struct vduse_iova_umem)
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/**
Open vSwitch CI c49a4a
+ * struct vduse_iova_info - information of one IOVA region
Open vSwitch CI c49a4a
+ * @start: start of the IOVA region
Open vSwitch CI c49a4a
+ * @last: last of the IOVA region
Open vSwitch CI c49a4a
+ * @capability: capability of the IOVA regsion
Open vSwitch CI c49a4a
+ * @reserved: for future use, needs to be initialized to zero
Open vSwitch CI c49a4a
+ *
Open vSwitch CI c49a4a
+ * Structure used by VDUSE_IOTLB_GET_INFO ioctl to get information of
Open vSwitch CI c49a4a
+ * one IOVA region.
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+struct vduse_iova_info {
Open vSwitch CI c49a4a
+	__u64 start;
Open vSwitch CI c49a4a
+	__u64 last;
Open vSwitch CI c49a4a
+#define VDUSE_IOVA_CAP_UMEM (1 << 0)
Open vSwitch CI c49a4a
+	__u64 capability;
Open vSwitch CI c49a4a
+	__u64 reserved[3];
Open vSwitch CI c49a4a
+};
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/*
Open vSwitch CI c49a4a
+ * Find the first IOVA region that overlaps with the range [start, last]
Open vSwitch CI c49a4a
+ * and return some information on it. Caller should set start and last fields.
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+#define VDUSE_IOTLB_GET_INFO	_IOWR(VDUSE_BASE, 0x1a, struct vduse_iova_info)
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/* The control messages definition for read(2)/write(2) on /dev/vduse/$NAME */
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/**
Open vSwitch CI c49a4a
+ * enum vduse_req_type - request type
Open vSwitch CI c49a4a
+ * @VDUSE_GET_VQ_STATE: get the state for specified virtqueue from userspace
Open vSwitch CI c49a4a
+ * @VDUSE_SET_STATUS: set the device status
Open vSwitch CI c49a4a
+ * @VDUSE_UPDATE_IOTLB: Notify userspace to update the memory mapping for
Open vSwitch CI c49a4a
+ *                      specified IOVA range via VDUSE_IOTLB_GET_FD ioctl
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+enum vduse_req_type {
Open vSwitch CI c49a4a
+	VDUSE_GET_VQ_STATE,
Open vSwitch CI c49a4a
+	VDUSE_SET_STATUS,
Open vSwitch CI c49a4a
+	VDUSE_UPDATE_IOTLB,
Open vSwitch CI c49a4a
+};
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/**
Open vSwitch CI c49a4a
+ * struct vduse_vq_state - virtqueue state
Open vSwitch CI c49a4a
+ * @index: virtqueue index
Open vSwitch CI c49a4a
+ * @split: split virtqueue state
Open vSwitch CI c49a4a
+ * @packed: packed virtqueue state
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+struct vduse_vq_state {
Open vSwitch CI c49a4a
+	__u32 index;
Open vSwitch CI c49a4a
+	union {
Open vSwitch CI c49a4a
+		struct vduse_vq_state_split split;
Open vSwitch CI c49a4a
+		struct vduse_vq_state_packed packed;
Open vSwitch CI c49a4a
+	};
Open vSwitch CI c49a4a
+};
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/**
Open vSwitch CI c49a4a
+ * struct vduse_dev_status - device status
Open vSwitch CI c49a4a
+ * @status: device status
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+struct vduse_dev_status {
Open vSwitch CI c49a4a
+	__u8 status;
Open vSwitch CI c49a4a
+};
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/**
Open vSwitch CI c49a4a
+ * struct vduse_iova_range - IOVA range [start, last]
Open vSwitch CI c49a4a
+ * @start: start of the IOVA range
Open vSwitch CI c49a4a
+ * @last: last of the IOVA range
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+struct vduse_iova_range {
Open vSwitch CI c49a4a
+	__u64 start;
Open vSwitch CI c49a4a
+	__u64 last;
Open vSwitch CI c49a4a
+};
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/**
Open vSwitch CI c49a4a
+ * struct vduse_dev_request - control request
Open vSwitch CI c49a4a
+ * @type: request type
Open vSwitch CI c49a4a
+ * @request_id: request id
Open vSwitch CI c49a4a
+ * @reserved: for future use
Open vSwitch CI c49a4a
+ * @vq_state: virtqueue state, only index field is available
Open vSwitch CI c49a4a
+ * @s: device status
Open vSwitch CI c49a4a
+ * @iova: IOVA range for updating
Open vSwitch CI c49a4a
+ * @padding: padding
Open vSwitch CI c49a4a
+ *
Open vSwitch CI c49a4a
+ * Structure used by read(2) on /dev/vduse/$NAME.
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+struct vduse_dev_request {
Open vSwitch CI c49a4a
+	__u32 type;
Open vSwitch CI c49a4a
+	__u32 request_id;
Open vSwitch CI c49a4a
+	__u32 reserved[4];
Open vSwitch CI c49a4a
+	union {
Open vSwitch CI c49a4a
+		struct vduse_vq_state vq_state;
Open vSwitch CI c49a4a
+		struct vduse_dev_status s;
Open vSwitch CI c49a4a
+		struct vduse_iova_range iova;
Open vSwitch CI c49a4a
+		__u32 padding[32];
Open vSwitch CI c49a4a
+	};
Open vSwitch CI c49a4a
+};
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+/**
Open vSwitch CI c49a4a
+ * struct vduse_dev_response - response to control request
Open vSwitch CI c49a4a
+ * @request_id: corresponding request id
Open vSwitch CI c49a4a
+ * @result: the result of request
Open vSwitch CI c49a4a
+ * @reserved: for future use, needs to be initialized to zero
Open vSwitch CI c49a4a
+ * @vq_state: virtqueue state
Open vSwitch CI c49a4a
+ * @padding: padding
Open vSwitch CI c49a4a
+ *
Open vSwitch CI c49a4a
+ * Structure used by write(2) on /dev/vduse/$NAME.
Open vSwitch CI c49a4a
+ */
Open vSwitch CI c49a4a
+struct vduse_dev_response {
Open vSwitch CI c49a4a
+	__u32 request_id;
Open vSwitch CI c49a4a
+#define VDUSE_REQ_RESULT_OK	0x00
Open vSwitch CI c49a4a
+#define VDUSE_REQ_RESULT_FAILED	0x01
Open vSwitch CI c49a4a
+	__u32 result;
Open vSwitch CI c49a4a
+	__u32 reserved[4];
Open vSwitch CI c49a4a
+	union {
Open vSwitch CI c49a4a
+		struct vduse_vq_state vq_state;
Open vSwitch CI c49a4a
+		__u32 padding[32];
Open vSwitch CI c49a4a
+	};
Open vSwitch CI c49a4a
+};
Open vSwitch CI c49a4a
+
Open vSwitch CI c49a4a
+#endif /* _UAPI_VDUSE_H_ */
Open vSwitch CI c49a4a
diff --git a/dpdk/lib/vhost/meson.build b/dpdk/lib/vhost/meson.build
Open vSwitch CI c49a4a
index 51bcf17244..0004f283bb 100644
Open vSwitch CI c49a4a
--- a/dpdk/lib/vhost/meson.build
Open vSwitch CI c49a4a
+++ b/dpdk/lib/vhost/meson.build
Open vSwitch CI c49a4a
@@ -26,16 +26,13 @@ sources = files(
Open vSwitch CI c49a4a
         'iotlb.c',
Open vSwitch CI c49a4a
         'socket.c',
Open vSwitch CI c49a4a
         'vdpa.c',
Open vSwitch CI c49a4a
+        'vduse.c',
Open vSwitch CI c49a4a
         'vhost.c',
Open vSwitch CI c49a4a
         'vhost_crypto.c',
Open vSwitch CI c49a4a
         'vhost_user.c',
Open vSwitch CI c49a4a
         'virtio_net.c',
Open vSwitch CI c49a4a
         'virtio_net_ctrl.c',
Open vSwitch CI c49a4a
 )
Open vSwitch CI c49a4a
-if cc.has_header('linux/vduse.h')
Open vSwitch CI c49a4a
-    sources += files('vduse.c')
Open vSwitch CI c49a4a
-    cflags += '-DVHOST_HAS_VDUSE'
Open vSwitch CI c49a4a
-endif
Open vSwitch CI c49a4a
 headers = files(
Open vSwitch CI c49a4a
         'rte_vdpa.h',
Open vSwitch CI c49a4a
         'rte_vhost.h',
Open vSwitch CI c49a4a
diff --git a/dpdk/lib/vhost/vduse.c b/dpdk/lib/vhost/vduse.c
Open vSwitch CI c49a4a
index 8ba58555f9..eaf3146b95 100644
Open vSwitch CI c49a4a
--- a/dpdk/lib/vhost/vduse.c
Open vSwitch CI c49a4a
+++ b/dpdk/lib/vhost/vduse.c
Open vSwitch CI c49a4a
@@ -8,7 +8,7 @@
Open vSwitch CI c49a4a
 #include <fcntl.h>
Open vSwitch CI c49a4a
 
Open vSwitch CI c49a4a
 
Open vSwitch CI c49a4a
-#include <linux/vduse.h>
Open vSwitch CI c49a4a
+#include <uapi/linux/vduse.h>
Open vSwitch CI c49a4a
 #include <linux/virtio_net.h>
Open vSwitch CI c49a4a
 
Open vSwitch CI c49a4a
 #include <sys/ioctl.h>
Open vSwitch CI c49a4a
diff --git a/dpdk/lib/vhost/vduse.h b/dpdk/lib/vhost/vduse.h
Open vSwitch CI c49a4a
index 0d8f3f1205..47ca97a064 100644
Open vSwitch CI c49a4a
--- a/dpdk/lib/vhost/vduse.h
Open vSwitch CI c49a4a
+++ b/dpdk/lib/vhost/vduse.h
Open vSwitch CI c49a4a
@@ -9,29 +9,7 @@
Open vSwitch CI c49a4a
 
Open vSwitch CI c49a4a
 #define VDUSE_NET_SUPPORTED_FEATURES VIRTIO_NET_SUPPORTED_FEATURES
Open vSwitch CI c49a4a
 
Open vSwitch CI c49a4a
-#ifdef VHOST_HAS_VDUSE
Open vSwitch CI c49a4a
-
Open vSwitch CI c49a4a
 int vduse_device_create(const char *path, bool compliant_ol_flags);
Open vSwitch CI c49a4a
 int vduse_device_destroy(const char *path);
Open vSwitch CI c49a4a
 
Open vSwitch CI c49a4a
-#else
Open vSwitch CI c49a4a
-
Open vSwitch CI c49a4a
-static inline int
Open vSwitch CI c49a4a
-vduse_device_create(const char *path, bool compliant_ol_flags)
Open vSwitch CI c49a4a
-{
Open vSwitch CI c49a4a
-	RTE_SET_USED(compliant_ol_flags);
Open vSwitch CI c49a4a
-
Open vSwitch CI c49a4a
-	VHOST_CONFIG_LOG(path, ERR, "VDUSE support disabled at build time");
Open vSwitch CI c49a4a
-	return -1;
Open vSwitch CI c49a4a
-}
Open vSwitch CI c49a4a
-
Open vSwitch CI c49a4a
-static inline int
Open vSwitch CI c49a4a
-vduse_device_destroy(const char *path)
Open vSwitch CI c49a4a
-{
Open vSwitch CI c49a4a
-	VHOST_CONFIG_LOG(path, ERR, "VDUSE support disabled at build time");
Open vSwitch CI c49a4a
-	return -1;
Open vSwitch CI c49a4a
-}
Open vSwitch CI c49a4a
-
Open vSwitch CI c49a4a
-#endif /* VHOST_HAS_VDUSE */
Open vSwitch CI c49a4a
-
Open vSwitch CI c49a4a
 #endif /* _VDUSE_H */
Open vSwitch CI 70cc8f
diff --git a/dpdk/lib/vhost/virtio_net.c b/dpdk/lib/vhost/virtio_net.c
Open vSwitch CI 70cc8f
index d764d4bc6a..a340e5a772 100644
Open vSwitch CI 70cc8f
--- a/dpdk/lib/vhost/virtio_net.c
Open vSwitch CI 70cc8f
+++ b/dpdk/lib/vhost/virtio_net.c
Open vSwitch CI 70cc8f
@@ -2823,6 +2823,9 @@ vhost_dequeue_offload(struct virtio_net *dev, struct virtio_net_hdr *hdr,
Open vSwitch CI 70cc8f
 			 */
Open vSwitch CI 70cc8f
 			uint16_t csum = 0, off;
Open vSwitch CI 70cc8f
 
Open vSwitch CI 70cc8f
+			if (hdr->csum_start >= rte_pktmbuf_pkt_len(m))
Open vSwitch CI 70cc8f
+				return;
Open vSwitch CI 70cc8f
+
Open vSwitch CI 70cc8f
 			if (rte_raw_cksum_mbuf(m, hdr->csum_start,
Open vSwitch CI 70cc8f
 					rte_pktmbuf_pkt_len(m) - hdr->csum_start, &csum) < 0)
Open vSwitch CI 70cc8f
 				return;
Open vSwitch CI 70cc8f
@@ -3626,6 +3629,8 @@ rte_vhost_dequeue_burst(int vid, uint16_t queue_id,
Open vSwitch CI 70cc8f
 		rte_rwlock_read_unlock(&vq->access_lock);
Open vSwitch CI 70cc8f
 
Open vSwitch CI 70cc8f
 		virtio_dev_vring_translate(dev, vq);
Open vSwitch CI 70cc8f
+
Open vSwitch CI 70cc8f
+		count = 0;
Open vSwitch CI 70cc8f
 		goto out_no_unlock;
Open vSwitch CI 70cc8f
 	}
Open vSwitch CI 70cc8f