[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] Add VIF interface V11


  • To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
  • From: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
  • Date: Wed, 14 Oct 2026 12:11:46 +0200
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=vates.tech header.i="@vates.tech" header.h="From:Subject:Date:Message-ID:To:Cc:MIME-Version:Content-Type:Feedback-ID"
  • Cc: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
  • Delivery-date: Wed, 14 Oct 2026 10:11:59 +0000
  • Feedback-id: default:8631fc262581453bbf619ec5b2062170:Sweego
  • List-id: Developer list for the Windows PV Drivers subproject <win-pv-devel.lists.xenproject.org>

This version adds a MaxCount output to QueryRingCount that represents
the maximum number of rings supported by the current XenVif/XenNet.

Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
---
 include/revision.h      |  3 +-
 include/vif_interface.h | 59 +++++++++++++++++++++++++++++++---
 src/xenvif/vif.c        | 70 +++++++++++++++++++++++++++++++++++++++--
 3 files changed, 123 insertions(+), 9 deletions(-)

diff --git a/include/revision.h b/include/revision.h
index d23639f..4e6a454 100644
--- a/include/revision.h
+++ b/include/revision.h
@@ -46,6 +46,7 @@
     DEFINE_REVISION(0x09000002,  2,  9,   2,  1,   1),  \
     DEFINE_REVISION(0x09000003,  2,  10,  2,  1,   1),  \
     DEFINE_REVISION(0x09000004,  2,  10,  2,  1,   2),  \
-    DEFINE_REVISION(0x09000005,  2,  10,  2,  1,   3)
+    DEFINE_REVISION(0x09000005,  2,  10,  2,  1,   3),  \
+    DEFINE_REVISION(0x09000006,  2,  11,  2,  1,   3)
 
 #endif  // _REVISION_H
diff --git a/include/vif_interface.h b/include/vif_interface.h
index cc2f626..66053a1 100644
--- a/include/vif_interface.h
+++ b/include/vif_interface.h
@@ -567,17 +567,32 @@ typedef NTSTATUS
     _Out_ PULONGLONG            Value
     );
 
+/*! \typedef XENVIF_VIF_QUERY_RING_COUNT_V8
+    \brief Query the number of shared rings between frontend
+    and backend
+
+    \param Interface The interface header
+    \param Count Buffer to receive the count
+*/
+typedef VOID
+(*XENVIF_VIF_QUERY_RING_COUNT_V8)(
+    _In_ PINTERFACE Interface,
+    _Out_ PULONG    Count
+    );
+
 /*! \typedef XENVIF_VIF_QUERY_RING_COUNT
     \brief Query the number of shared rings between frontend
     and backend
 
     \param Interface The interface header
     \param Count Buffer to receive the count
+    \param MaxCount Buffer to receive the maximum possible ring count
 */
 typedef VOID
 (*XENVIF_VIF_QUERY_RING_COUNT)(
     _In_ PINTERFACE Interface,
-    _Out_ PULONG    Count
+    _Out_ PULONG    Count,
+    _Out_ PULONG    MaxCount
     );
 
 /*! \typedef XENVIF_VIF_UPDATE_HASH_MAPPING
@@ -900,7 +915,7 @@ struct _XENVIF_VIF_INTERFACE_V8 {
     XENVIF_VIF_ENABLE_V8                            EnableVersion8;
     XENVIF_VIF_DISABLE                              Disable;
     XENVIF_VIF_QUERY_STATISTIC                      QueryStatistic;
-    XENVIF_VIF_QUERY_RING_COUNT                     QueryRingCount;
+    XENVIF_VIF_QUERY_RING_COUNT_V8                  QueryRingCountVersion8;
     XENVIF_VIF_UPDATE_HASH_MAPPING                  UpdateHashMapping;
     XENVIF_VIF_RECEIVER_RETURN_PACKET               ReceiverReturnPacket;
     XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS         ReceiverSetOffloadOptions;
@@ -934,7 +949,7 @@ struct _XENVIF_VIF_INTERFACE_V9 {
     XENVIF_VIF_ENABLE_V9                            EnableVersion9;
     XENVIF_VIF_DISABLE                              Disable;
     XENVIF_VIF_QUERY_STATISTIC                      QueryStatistic;
-    XENVIF_VIF_QUERY_RING_COUNT                     QueryRingCount;
+    XENVIF_VIF_QUERY_RING_COUNT_V8                  QueryRingCountVersion8;
     XENVIF_VIF_UPDATE_HASH_MAPPING                  UpdateHashMapping;
     XENVIF_VIF_RECEIVER_RETURN_PACKET               ReceiverReturnPacket;
     XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS         ReceiverSetOffloadOptions;
@@ -962,6 +977,40 @@ struct _XENVIF_VIF_INTERFACE_V9 {
     \ingroup interfaces
 */
 struct _XENVIF_VIF_INTERFACE_V10 {
+    INTERFACE                                       Interface;
+    XENVIF_VIF_ACQUIRE                              Acquire;
+    XENVIF_VIF_RELEASE                              Release;
+    XENVIF_VIF_ENABLE                               Enable;
+    XENVIF_VIF_DISABLE                              Disable;
+    XENVIF_VIF_QUERY_STATISTIC                      QueryStatistic;
+    XENVIF_VIF_QUERY_RING_COUNT_V8                  QueryRingCountVersion8;
+    XENVIF_VIF_UPDATE_HASH_MAPPING                  UpdateHashMapping;
+    XENVIF_VIF_RECEIVER_RETURN_PACKET               ReceiverReturnPacket;
+    XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS         ReceiverSetOffloadOptions;
+    XENVIF_VIF_RECEIVER_SET_BACKFILL_SIZE           ReceiverSetBackfillSize;
+    XENVIF_VIF_RECEIVER_QUERY_RING_SIZE             ReceiverQueryRingSize;
+    XENVIF_VIF_RECEIVER_SET_HASH_ALGORITHM          ReceiverSetHashAlgorithm;
+    XENVIF_VIF_RECEIVER_QUERY_HASH_CAPABILITIES     
ReceiverQueryHashCapabilities;
+    XENVIF_VIF_RECEIVER_UPDATE_HASH_PARAMETERS      
ReceiverUpdateHashParameters;
+    XENVIF_VIF_TRANSMITTER_QUEUE_PACKET             TransmitterQueuePacket;
+    XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS    
TransmitterQueryOffloadOptions;
+    XENVIF_VIF_TRANSMITTER_QUERY_LARGE_PACKET_SIZE  
TransmitterQueryLargePacketSize;
+    XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE          TransmitterQueryRingSize;
+    XENVIF_VIF_MAC_QUERY_STATE                      MacQueryState;
+    XENVIF_VIF_MAC_QUERY_MAXIMUM_FRAME_SIZE         MacQueryMaximumFrameSize;
+    XENVIF_VIF_MAC_QUERY_PERMANENT_ADDRESS          MacQueryPermanentAddress;
+    XENVIF_VIF_MAC_QUERY_CURRENT_ADDRESS            MacQueryCurrentAddress;
+    XENVIF_VIF_MAC_QUERY_MULTICAST_ADDRESSES        MacQueryMulticastAddresses;
+    XENVIF_VIF_MAC_SET_MULTICAST_ADDRESSES          MacSetMulticastAddresses;
+    XENVIF_VIF_MAC_SET_FILTER_LEVEL                 MacSetFilterLevel;
+    XENVIF_VIF_MAC_QUERY_FILTER_LEVEL               MacQueryFilterLevel;
+};
+
+/*! \struct _XENVIF_VIF_INTERFACE_V11
+    \brief VIF interface version 11
+    \ingroup interfaces
+*/
+struct _XENVIF_VIF_INTERFACE_V11 {
     INTERFACE                                       Interface;
     XENVIF_VIF_ACQUIRE                              Acquire;
     XENVIF_VIF_RELEASE                              Release;
@@ -991,7 +1040,7 @@ struct _XENVIF_VIF_INTERFACE_V10 {
     XENVIF_VIF_MAC_QUERY_FILTER_LEVEL               MacQueryFilterLevel;
 };
 
-typedef struct _XENVIF_VIF_INTERFACE_V10 XENVIF_VIF_INTERFACE, 
*PXENVIF_VIF_INTERFACE;
+typedef struct _XENVIF_VIF_INTERFACE_V11 XENVIF_VIF_INTERFACE, 
*PXENVIF_VIF_INTERFACE;
 
 /*! \def XENVIF_VIF
     \brief Macro at assist in method invocation
@@ -1002,6 +1051,6 @@ typedef struct _XENVIF_VIF_INTERFACE_V10 
XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTE
 #endif  // _WINDLL
 
 #define XENVIF_VIF_INTERFACE_VERSION_MIN    8
-#define XENVIF_VIF_INTERFACE_VERSION_MAX    10
+#define XENVIF_VIF_INTERFACE_VERSION_MAX    11
 
 #endif  // _XENVIF_INTERFACE_H
diff --git a/src/xenvif/vif.c b/src/xenvif/vif.c
index 4937bb6..4396fcc 100644
--- a/src/xenvif/vif.c
+++ b/src/xenvif/vif.c
@@ -536,7 +536,7 @@ done:
 }
 
 static VOID
-VifQueryRingCount(
+VifQueryRingCountVersion8(
     _In_ PINTERFACE     Interface,
     _Out_ PULONG        Count
     )
@@ -550,6 +550,23 @@ VifQueryRingCount(
     ReleaseMrswLockShared(&Context->Lock);
 }
 
+static VOID
+VifQueryRingCount(
+    _In_ PINTERFACE     Interface,
+    _Out_ PULONG        Count,
+    _Out_ PULONG        MaxCount
+    )
+{
+    PXENVIF_VIF_CONTEXT Context = Interface->Context;
+
+    AcquireMrswLockShared(&Context->Lock);
+
+    *Count = FrontendGetNumQueues(Context->Frontend);
+    *MaxCount = FrontendGetMaxQueues(Context->Frontend);
+
+    ReleaseMrswLockShared(&Context->Lock);
+}
+
 static NTSTATUS
 VifUpdateHashMapping(
     _In_ PINTERFACE         Interface,
@@ -1008,7 +1025,7 @@ static struct _XENVIF_VIF_INTERFACE_V8 
VifInterfaceVersion8 = {
     VifEnableVersion8,
     VifDisable,
     VifQueryStatistic,
-    VifQueryRingCount,
+    VifQueryRingCountVersion8,
     VifUpdateHashMapping,
     VifReceiverReturnPacket,
     VifReceiverSetOffloadOptions,
@@ -1038,7 +1055,7 @@ static struct _XENVIF_VIF_INTERFACE_V9 
VifInterfaceVersion9 = {
     VifEnableVersion9,
     VifDisable,
     VifQueryStatistic,
-    VifQueryRingCount,
+    VifQueryRingCountVersion8,
     VifUpdateHashMapping,
     VifReceiverReturnPacket,
     VifReceiverSetOffloadOptions,
@@ -1068,6 +1085,36 @@ static struct _XENVIF_VIF_INTERFACE_V10 
VifInterfaceVersion10 = {
     VifEnable,
     VifDisable,
     VifQueryStatistic,
+    VifQueryRingCountVersion8,
+    VifUpdateHashMapping,
+    VifReceiverReturnPacket,
+    VifReceiverSetOffloadOptions,
+    VifReceiverSetBackfillSize,
+    VifReceiverQueryRingSize,
+    VifReceiverSetHashAlgorithm,
+    VifReceiverQueryHashCapabilities,
+    VifReceiverUpdateHashParameters,
+    VifTransmitterQueuePacket,
+    VifTransmitterQueryOffloadOptions,
+    VifTransmitterQueryLargePacketSize,
+    VifTransmitterQueryRingSize,
+    VifMacQueryState,
+    VifMacQueryMaximumFrameSize,
+    VifMacQueryPermanentAddress,
+    VifMacQueryCurrentAddress,
+    VifMacQueryMulticastAddresses,
+    VifMacSetMulticastAddresses,
+    VifMacSetFilterLevel,
+    VifMacQueryFilterLevel
+};
+
+static struct _XENVIF_VIF_INTERFACE_V11 VifInterfaceVersion11 = {
+    { sizeof (struct _XENVIF_VIF_INTERFACE_V11), 11, NULL, NULL, NULL },
+    VifAcquire,
+    VifRelease,
+    VifEnable,
+    VifDisable,
+    VifQueryStatistic,
     VifQueryRingCount,
     VifUpdateHashMapping,
     VifReceiverReturnPacket,
@@ -1211,6 +1258,23 @@ VifGetInterface(
         status = STATUS_SUCCESS;
         break;
     }
+    case 11: {
+        struct _XENVIF_VIF_INTERFACE_V11 *VifInterface;
+
+        VifInterface = (struct _XENVIF_VIF_INTERFACE_V11 *)Interface;
+
+        status = STATUS_BUFFER_OVERFLOW;
+        if (Size < sizeof (struct _XENVIF_VIF_INTERFACE_V11))
+            break;
+
+        *VifInterface = VifInterfaceVersion11;
+
+        ASSERT3U(Interface->Version, ==, Version);
+        Interface->Context = Context;
+
+        status = STATUS_SUCCESS;
+        break;
+    }
     default:
         status = STATUS_NOT_SUPPORTED;
         break;
-- 
2.55.0.windows.3



--
Ngoc Tu Dinh | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.